/**
 * Created by Administrator on 2017/11/7.
 * Copyright 2017-2018 汉威.智慧环保事业部 Limited.
 * All rights reserved.
 */
package com.hw.one.collect.radar.service;

import com.alibaba.fastjson.JSON;
import com.hw.one.collect.mapper.SiteDao;
import com.hw.one.collect.radar.dao.RadarDataDao;
import com.hw.one.collect.radar.po.MultipleDataPo;
import com.hw.one.collect.radar.po.RadarSitePo;
import com.hw.one.collect.radar.po.SingleDataPo;
import com.hw.one.collect.radar.redis.RedisUtil;
import com.hw.one.collect.util.Base64Util;
import com.hw.one.collect.util.ZLibUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static com.hw.one.collect.radar.job.RadarDataJob.radarSiteMap;

@Service
public class RadarService {

    @Resource
    private RadarDataDao radarDataDao;
    @Resource
    private SiteDao siteDao;

    /**
     * 单条数据的处理（查缺补漏）
     * 情况1：库里不存在相同数据，直接添加；
     * 情况2：库里已存在重复数据，查缺补漏；(差缺不漏暂不对压缩数据处理)
     *
     * @param newSingleData
     */

    public void checkMissingTrapSingleData(SingleDataPo newSingleData) {
        SingleDataPo orgSingleData = radarDataDao.findOneSingleDataBySiteCodeAndTime(newSingleData);
        // 情况1
        if (null == orgSingleData) {
            radarDataDao.saveSingleRadarData(newSingleData);
            return;
        }
        // 情况2
        if (StringUtils.isEmpty(newSingleData.getRADARCODE())) {
            newSingleData.setRADARCODE(orgSingleData.getRADARCODE());
        }
        if (StringUtils.isEmpty(newSingleData.getSITENAME())) {
            newSingleData.setSITENAME(orgSingleData.getSITENAME());
        }
        if (StringUtils.isEmpty(newSingleData.getSITETYPECODE())) {
            newSingleData.setSITETYPECODE(orgSingleData.getSITETYPECODE());
        }
        if (ObjectUtils.isEmpty(newSingleData.getRADARLOC())) {
            newSingleData.setRADARLOC(orgSingleData.getRADARLOC());
        }
        if (ObjectUtils.isEmpty(newSingleData.getANGLE())) {
            newSingleData.setANGLE(orgSingleData.getANGLE());
        }

        // 删除原来的数据，添加新的数据
        radarDataDao.deleteSingleRadarData(orgSingleData);
        radarDataDao.saveSingleRadarData(newSingleData);
    }

    /**
     * 周期数据的处理（查缺补漏）
     * 情况1：库里不存在相同数据，直接添加；
     * 情况2：库里已存在重复数据，查缺补漏；（针对压缩数据暂不做处理）
     *
     * @param newMultipleData
     */

    public void checkMissingTrapMultipleData(MultipleDataPo newMultipleData) {
        MultipleDataPo orgMultipleDataPo = radarDataDao.findOneMultipleDataBySiteCodeAndTime(newMultipleData);
        // 情况1
        if (null == orgMultipleDataPo) {
            radarDataDao.saveMultipleRadarData(newMultipleData);
            return;
        }
        // 情况2
        if (StringUtils.isEmpty(newMultipleData.getRADARCODE())) {
            newMultipleData.setRADARCODE(orgMultipleDataPo.getRADARCODE());
        }
        if (StringUtils.isEmpty(newMultipleData.getSITENAME())) {
            newMultipleData.setSITENAME(orgMultipleDataPo.getSITENAME());
        }
        if (StringUtils.isEmpty(newMultipleData.getSITETYPECODE())) {
            newMultipleData.setSITETYPECODE(orgMultipleDataPo.getSITETYPECODE());
        }
        if (ObjectUtils.isEmpty(newMultipleData.getRADARLOC())) {
            newMultipleData.setRADARLOC(orgMultipleDataPo.getRADARLOC());
        }
        if (StringUtils.isEmpty(newMultipleData.getSTARTTIME())) {
            newMultipleData.setSTARTTIME(orgMultipleDataPo.getSTARTTIME());
        }
        if (StringUtils.isEmpty(newMultipleData.getENDTIME())) {
            newMultipleData.setENDTIME(orgMultipleDataPo.getENDTIME());
        }
        // 针对每个角度进行查漏补缺 angleLen和i是同步进行的
        int angleLen = 0;
        List<SingleDataPo> tempSingleDataList = new ArrayList<>();
        for (int i = 0; i < newMultipleData.getANGLEDATA().length; i++) {
            SingleDataPo newSingleData = newMultipleData.getANGLEDATA()[i];
            while (angleLen < orgMultipleDataPo.getANGLEDATA().length) {
                SingleDataPo orgSingleData = orgMultipleDataPo.getANGLEDATA()[angleLen];
                if (newSingleData.getANGLE() < orgSingleData.getANGLE()) {
                    break;
                } else if (newSingleData.getANGLE() > orgSingleData.getANGLE()) {
                    tempSingleDataList.add(orgSingleData);
                } else {
                    // 如果角度相同，对每一个点位进行查漏补缺
                    tempSingleDataList.add(newSingleData);
                }
                angleLen++;
            }
        }
        // 转换数组
        SingleDataPo[] tempSingleData = new SingleDataPo[tempSingleDataList.size()];
        tempSingleData = tempSingleDataList.toArray(tempSingleData);
        // 重新赋值
        newMultipleData.setANGLEDATA(tempSingleData);

        // 删除原来的数据，添加新的数据
        radarDataDao.deleteMultipleRadarData(orgMultipleDataPo);
        radarDataDao.saveMultipleRadarData(newMultipleData);

    }

    /**
     * 根据雷达编码获取雷达的基本信息
     *
     * @param radarCode
     * @return
     */

    public RadarSitePo getRadarSiteInfo(String radarCode) {
        RadarSitePo radarSitePo = radarSiteMap.get(radarCode);
        if (null == radarSitePo) {
            List<RadarSitePo> radarSitePos = siteDao.selectRadarAndSiteInfo(new HashMap<String, Object>());
            for (RadarSitePo po : radarSitePos) {
                if (po.getSNCode().equals(radarCode)) {
                    radarSitePo = po;
                }
                radarSiteMap.put(po.getSNCode(), po);
            }
        }
        return radarSitePo;
    }
}
